#include <stdio.h>
#include <stdlib.h>
#include "signal.h"
#include <iostream>
#include <signal.h>
#include <unistd.h>


#include <stdio.h>

int main() {
    int arr[5] = {0, 1, 2, 3, 4}; // 定义一个大小为5的整型数组
    int *ptr = arr;

    // 访问数组的有效索引是从0到4
    for (int i = 0; i <= 5; ++i) { // 注意这里是<=5，而不是<5
        printf("%d\n", ptr[i]); // 当i=5时，访问arr[5]即越界访问
    }

    return 0;
}

// /**
//  * 捕获并处理特定的信号
//  * 
//  * @param sig 接收到的信号。此函数旨在处理SIGSEGV信号（段错误），但对于其他信号，也可根据需要进行处理。
//  * @return 该函数不返回任何值，而是直接终止程序。
//  */
// void catchSig(int sig) {
//     if (sig == SIGSEGV) {
//         printf("Caught segmentation fault (SIGSEGV)!\n");
//         // 当捕获到SIGSEGV信号时，表示程序发生了段错误。这里可以添加额外的错误处理逻辑，但由於错误的严重性，程序可能无法稳定运行，最好在处理后退出。
//         _exit(EXIT_FAILURE);
//     } else {
//         fprintf(stderr, "Caught unexpected signal %d\n", sig);
//         // 如果捕获到的信号不是SIGSEGV，打印错误信息到标准错误输出。对于其他信号，可以根据具体需求添加相应的处理逻辑。
//         // 但在这个例子中，我们仅打印错误信息后直接退出程序。
//         _exit(EXIT_FAILURE);
//     }
// }

// int main() {
//     signal(SIGSEGV, catchSig);  // 注册SIGSEGV信号处理器
//     int *ptr;
//     // 指针未初始化，此时ptr的值是不确定的
//     printf("%d\n", *ptr);  // 这一行可能触发段错误(SIGSEGV)

//     return 0;
// }

// void catchSig(int sig)
// {
//     std::cout << "catch signal " << sig << std::endl;
// }
// int main()
// {
//     for (int i = 1; i <= 31; i++)
//         signal(i, catchSig);
//     while (1)
//         sleep(1);
// }
// /*
// [hbr@VM-16-9-centos signal]$ ./mysignal 
// catch signal 1
// catch signal 2
// Killed
// [hbr@VM-16-9-centos signal]$

// [hbr@VM-16-9-centos signal]$ kill -1 29748
// [hbr@VM-16-9-centos signal]$ 
// [hbr@VM-16-9-centos signal]$ kill -2 29748
// [hbr@VM-16-9-centos signal]$ kill -9 29748
// */